package com.ly.jdk8.stream;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * @Classname HandleStream
 * @Description
 * 中间操作    在终止操作结束前，不触发任何中间操作
 * 1.txt.筛选与切片
 * filter  过滤
 * limit   保留前n个
 * skip   跳过前n个
 * distinct  去重 根据hashcode和 equals去重
 *
 * 2.映射
 * 接受一个函数型接口，操作每一个元素
 * map 返回一个操作完成的流
 * flatmap 如果每一个元素操作变成一个流，将每一个元素的流，汇总成一个流
 *
 * 3.排序
 * sorted（）自然排序  comparable
 * sorted（Comparator  comparator) 定制排序
 *
 * 4.debug
 * peek  常常用于debug
 *
 * @Date 2020/9/27 16:58
 * @Author 冷心影翼
 */
public class HandleStream {

    private static List<User> u = new ArrayList<>();

    public static void main(String[] args) {
        u.add(new User(18,"A",0));
        u.add(new User(18,"A",0));
        u.add(new User(20,"B",1));
        u.add(new User(18,"C",0));
        u.add(new User(16,"D",1));
        u.add(new User(28,"E",0));
        u.add(new User(25,"F",1));
//        filter();
        map();
//        sort();
    }

    public static void filter() {
        u.stream().filter(u->u.getSex() == 0).forEach(System.out::println);
        System.out.println("-------");
        u.stream().filter(u->u.getSex() == 0).limit(2).forEach(System.out::println);
        System.out.println("-------");
        u.stream().filter(u->u.getSex() == 0).skip(2).forEach(System.out::println);
        System.out.println("-------");
        u.stream().filter(u->u.getSex() == 0).distinct().forEach(System.out::println);
    }

    public static void map() {
        u.stream()
            .limit(3)
            .map(it->"prefix_"+it.getName())
            .forEach(System.out::println);
        System.out.println("----------");
        List<List<User>> lists = new ArrayList<> ();
        List<User> u2 = new ArrayList<>();
        u2.addAll(u);
        lists.add(u);
        lists.add(u2);
        lists.stream()
            .flatMap(list->{
                return list.stream().distinct().limit(2).map(User::getName);
            }).forEach(System.out::println);
    }

    public static void sort() {
        u.stream().limit(3).map(it->it.getName()).sorted().forEach(System.out::println);
        u.stream().limit(3).sorted(Comparator.comparingInt(User::getAge)).forEach(System.out::println);
    }
}
